home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.4)
-
- '''Implement an OID to File-position (long integer) mapping.'''
- import struct
- from BTrees._fsBTree import fsBucket
- from BTrees.OOBTree import OOBTree
-
- def num2str(n):
- return struct.pack('>Q', n)[2:]
-
-
- def str2num(s):
- return struct.unpack('>Q', '\x00\x00' + s)[0]
-
-
- def prefix_plus_one(s):
- num = str2num(s)
- return num2str(num + 1)
-
-
- def prefix_minus_one(s):
- num = str2num(s)
- return num2str(num - 1)
-
-
- class fsIndex(object):
-
- def __init__(self):
- self._data = OOBTree()
-
-
- def __getitem__(self, key):
- return str2num(self._data[key[:6]][key[6:]])
-
-
- def get(self, key, default = None):
- tree = self._data.get(key[:6], default)
- if tree is default:
- return default
-
- v = tree.get(key[6:], default)
- if v is default:
- return default
-
- return str2num(v)
-
-
- def __setitem__(self, key, value):
- value = num2str(value)
- treekey = key[:6]
- tree = self._data.get(treekey)
- if tree is None:
- tree = fsBucket()
- self._data[treekey] = tree
-
- tree[key[6:]] = value
-
-
- def __len__(self):
- r = 0
- for tree in self._data.itervalues():
- r += len(tree)
-
- return r
-
-
- def update(self, mapping):
- for k, v in mapping.items():
- self[k] = v
-
-
-
- def has_key(self, key):
- v = self.get(key, self)
- return v is not self
-
-
- def __contains__(self, key):
- tree = self._data.get(key[:6])
- if tree is None:
- return False
-
- v = tree.get(key[6:], None)
- if v is None:
- return False
-
- return True
-
-
- def clear(self):
- self._data.clear()
-
-
- def __iter__(self):
- for prefix, tree in self._data.iteritems():
- for suffix in tree:
- yield prefix + suffix
-
-
-
- iterkeys = __iter__
-
- def keys(self):
- return list(self.iterkeys())
-
-
- def iteritems(self):
- for prefix, tree in self._data.iteritems():
- for suffix, value in tree.iteritems():
- yield (prefix + suffix, str2num(value))
-
-
-
-
- def items(self):
- return list(self.iteritems())
-
-
- def itervalues(self):
- for tree in self._data.itervalues():
- for value in tree.itervalues():
- yield str2num(value)
-
-
-
-
- def values(self):
- return list(self.itervalues())
-
-
- def minKey(self, key = None):
- if key is None:
- smallest_prefix = self._data.minKey()
- else:
- smallest_prefix = self._data.minKey(key[:6])
- tree = self._data[smallest_prefix]
- if not tree:
- raise AssertionError
- if key is None:
- smallest_suffix = tree.minKey()
- else:
-
- try:
- smallest_suffix = tree.minKey(key[6:])
- except ValueError:
- next_prefix = prefix_plus_one(smallest_prefix)
- smallest_prefix = self._data.minKey(next_prefix)
- tree = self._data[smallest_prefix]
- if not tree:
- raise AssertionError
- smallest_suffix = tree.minKey()
-
- return smallest_prefix + smallest_suffix
-
-
- def maxKey(self, key = None):
- if key is None:
- biggest_prefix = self._data.maxKey()
- else:
- biggest_prefix = self._data.maxKey(key[:6])
- tree = self._data[biggest_prefix]
- if not tree:
- raise AssertionError
- if key is None:
- biggest_suffix = tree.maxKey()
- else:
-
- try:
- biggest_suffix = tree.maxKey(key[6:])
- except ValueError:
- next_prefix = prefix_minus_one(biggest_prefix)
- biggest_prefix = self._data.maxKey(next_prefix)
- tree = self._data[biggest_prefix]
- if not tree:
- raise AssertionError
- biggest_suffix = tree.maxKey()
-
- return biggest_prefix + biggest_suffix
-
-
-